package com.lzw.DailyAudit;


import com.hooya.fa.eu.biz.DailyAudit.service.dataWarehousing_05.DataEntry;
import com.hooya.fa.eu.biz.DailyAudit.service.dateAggregation_02.*;
import com.hooya.fa.eu.biz.DailyAudit.service.dealSourceData_01.*;
import com.hooya.fa.eu.biz.DailyAudit.service.generateInvoices_03.AddInvoiceNo;
import com.hooya.fa.eu.biz.DailyAudit.service.generateInvoices_03.Insert_Add_Invoice;
import com.hooya.fa.eu.biz.DailyAudit.service.generateInvoices_03.Insert_Transfer_Invoice;
import com.hooya.fa.eu.biz.DailyAudit.service.generateInvoices_03.Update_InvoiceNo;
import com.hooya.fa.eu.biz.DailyAudit.service.issueReports_04.Inout;
import com.hooya.fa.eu.biz.DailyAudit.service.issueReports_04.ProfitCheck;
import com.hooya.fa.eu.biz.DailyAudit.service.issueReports_04.StockList;
import com.hooya.integrated.common.util.times.DateExtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
public class DailyAuditService {


	@Autowired
	private Pre_Test preTest;

	@Autowired
	private KcjlHy kcjlHy;

	@Autowired
	private Post_Test post_test;

	@Autowired
	private Insert_B2B insert_b2b;

	@Autowired
	private Insert_B2C insert_b2C;

	@Autowired
	private Insert_BS insert_bs;

	@Autowired
	private Insert_CG insert_cg;

	@Autowired
	private Insert_ZY insert_zy;

	@Autowired
	private Insert_TH insert_th;

	@Autowired
	private Reset_Sku_Flag reset_sku_flag;

	@Autowired
	private Insert_Add_Invoice insert_add_invoice;

	@Autowired
	private Insert_Transfer_Invoice insert_transfer_invoice;

	@Autowired
	private Update_InvoiceNo update_invoiceNo;

	@Autowired
	private Inout inout;

	@Autowired
	private StockList stockList;

	@Autowired
	private ProfitCheck profitCheck;

	@Autowired
	private postTest postTest;

	@Autowired
	private AddInvoiceNo addInvoiceNo;

	@Autowired
	private DailyStkCollectionService dailyStkCollectionService;

	@Autowired
	private DataEntry dataEntry;

	@GetMapping("/DailyAudit")
	public void auditRun() {

		// 设置前一天时间 -- 日审计
		String startDate = DateExtUtil.getBeforeNDays(1, LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
		int num = 1;

		dealSourceData_01(startDate, num);
		dateAggregation_02(startDate);
		generateInvoices_03(startDate);
		issueReports_04(startDate);
		dataEntry_05(startDate);
		log.info("日审计执行成功,执行日期为：{}", startDate);
	}

	/**
	 * 报表数据入，校验并拉取报表数据文件
	 *
	 * @param currentDate
	 */
	private void dataEntry_05(String currentDate) {
		dataEntry.dataEntry(currentDate);                                                         //日审计 - 完成
	}

	/**
	 * 生成报表inout，stockList，利润检查表
	 *
	 * @param currentDate
	 */
	private void issueReports_04(String currentDate) {
		inout.inout(currentDate, "costway-pl", "PL");                                //日审计 - 完成
		inout.inout(currentDate, "costway-fr", "FR");                                //日审计 - 完成
		stockList.stockList(currentDate);                                                           //日审计 - 完成
		profitCheck.profitCheck(currentDate);                                                       //日审计 - 完成
	}

	/**
	 * 添加发票数据并更新Stk发票号
	 *
	 * @param currentDate
	 */
	private void generateInvoices_03(String currentDate) {
		insert_add_invoice.insert_add_invoice(currentDate);                                        //日审计 - 完成
		insert_transfer_invoice.insert_transfer_invoice(currentDate);                              //日审计 - 完成
		addInvoiceNo.getInvoiceNo(currentDate);                                                    //日审计 - 完成 - TODO - 待解决 发票表中的一些其他的数据是否是从他们数据部门计算得来  后续保证数据正确性后，再行对接添加deliveryCharge(这并不影响报表，但是影响发票)
		update_invoiceNo.update_invoiceno(currentDate);                                            //日审计 - 完成
	}

	/**
	 * 将Temp数据入Stk表并校验
	 *
	 * @param currentDate
	 */
	private void dateAggregation_02(String currentDate) {    //数据源更改完毕
		insert_b2b.insert_b2b(currentDate);                                                        //日审计 - 完成 (price,oceanFee的价格差异是由于对时间范围的取值原因，在月审计中价格的取值取的是cpbh时间最早的那一批价格数据，而日审计中取值取得是当天的价格数据;exportPrice价格差则是由于dif的日期差，月审计中都使用每月的最后一天，而日审计中使用的是当天，而且exportPrice本身也是动态变化的)
		insert_b2C.insert_b2c(currentDate);                                                        //日审计 - 完成  - wxdj 保持与信息中心的sale_unit_price一致即可
		insert_bs.insert_bs(currentDate);                                                          //日审计 - 完成  这里的价格数据异常是由于时间计算的dif不同所导致，月审计中使用的是当月的最后一天，而日审计中使用的是当天
		insert_cg.insert_cg(currentDate);                                                          //日审计 - 完成
		insert_th.insert_th(currentDate);                                                          //日审计 - 完成  这里的价格数据异常是由于时间计算的dif不同所导致，月审计中使用的是当月的最后一天，而日审计中使用的是当天
		insert_zy.insert_zy(currentDate);                                                          //日审计 - 完成 (oceanFee的价格差异是由于对时间范围的取值原因，在月审计中价格的取值取的是cpbh时间最早的那一批价格数据，而日审计中取值取得是当天的价格数据;exportPrice和Price的值是一致的，但是他们本身数据是动态变化的)
		postTest.PostTest(currentDate);                                                            //日审计 - 完成
		reset_sku_flag.reset_sku_flag(currentDate);                                                //日审计 - 完成
	}

	/**
	 * 添加Temp数据并校验
	 *
	 * @param startDate
	 * @param num
	 */
	private void dealSourceData_01(String startDate, int num) {
		preTest.preTest();                                                                         //日审计 - 完成
		dailyStkCollectionService.generatorCollectionData_daily(startDate, num);                   //日审计 - 完成  （退货部分，由于使用了新的metaWarehouse映射表，所以会多出一些新的数据，而退货历史数据删除了之前的2022的表数据，所以会减少部分数据）
		kcjlHy.KcjlHy(startDate);                                                                  //日审计 - 完成  （hthm的差异来自于lastHis中的取值问题，htrq一致则比较hthm的中间6位数字；库存扣减同理）
		post_test.postTest(startDate);                                                             //日审计 - 完成
	}


}
